package kgame5.k3d.core.render.layerrender.impl {
import kgame5.k3d.core.obj3d.info.geometry.GeometryInfo;
import kgame5.k3d.core.obj3d.info.material.MaterialInfo;
import kgame5.k3d.core.obj3d.info.transform.TransformInfo;
import kgame5.k3d.core.render.RenderSessionData;
import kgame5.k3d.core.render.layerrender.LayerRender;
import kgame5.k3d.core.view3d.View3D;

import flash.display.MovieClip;

/**
 * @author kangkai
 */
public class Sprite3DLayerRender extends LayerRender{
	private var bUseScale:Boolean=false;
	private var bUseRotation:Boolean=false;//如果使用旋转，会对性能有很大损伤
	public function Sprite3DLayerRender(p_mc:MovieClip,bUseScale:Boolean=true,bUseRotation:Boolean=true){
		mc=p_mc;
		g=(mc as MovieClip).graphics;
		
		this.bUseScale=bUseScale;
		this.bUseRotation=bUseRotation;
		
		//!!没经过update之前不要显示，这个很重要，否则在屏幕上会有问题,默认生成的时候就在在(0,0)点的
		mc.visible=false;
	}

	//
	override public function  render(gi:GeometryInfo,mi:MaterialInfo,ti:TransformInfo,session:RenderSessionData):void{
		
		//能执行render表示在Model的Update里model.getVisible()=true
		//--!!重要的机制
		//在这里最终设置是否显示，很重要的设置，保证每次
		//md.setVisible之后都是在计算出新的位置之后才显示的，否则会显示错误的位置
		mc.visible=true;
		
		var x:Number=ti.Moc.m41;
		var y:Number=ti.Moc.m42;
		var z:Number=ti.Moc.m43;
		
		//移动
		//在投影面后面就不显示,是应该这么做的，小孔成像
		if(z<=0){
			//T.p("后面的不显示"+mc);
			mc.visible=false;
			return;
		}
		
		//在投影面后面，注意这个不会有z=0的情况，因为z<D就已经返回了
		var t:Number=View3D.D/z;
		
		var screenX:Number=x*t;
		var screenY:Number=-y*t;
		
		mc.x=screenX;//-my3DCenterOfs_x*t*sprite3DScaleX;//screenX
		mc.y=screenY;//-my3DCenterOfs_y*t*sprite3DScaleY;//screenY
		
		//旋转
		if(bUseRotation){
			mc.rotation = ti.hardVO.v3d_r.y;
		}
		
		//T.p("图片偏移 "+my3DCenterOfs_x*t+" "+my3DCenterOfs_y*t);
		//缩放
		mc.scaleX=ti.hardVO.v3d_s.x;
		mc.scaleY=ti.hardVO.v3d_s.y;
		if(bUseScale){//这个就是说可以选择不使用缩放,这样就可以保持2d的真实性了
			mc.scaleX*=t;
			mc.scaleY*=t;
		}
	}
}//end of class
}
